package com.roc.template.cloud;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.roc.template.cloud.constant.AccessTokenType;
import com.roc.template.cloud.factory.AccessTokenFactory;
import com.roc.template.cloud.factory.impl.TeamAccessToken;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName CloudController
 * @Description: TODO
 * @Author Administrator
 * @Date 2020/7/30 14 57
 * @Version V1.0
 **/
@RestController
@Api(description = "mongo基本操作")
public class CloudController {

    @Resource
    private  CloudConfig cloudConfig;

    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("/test")
    @ResponseBody
    private Object test( HttpServletRequest request) {

        String jsonParam = getJSONParam(request);
        TeamAccessToken teamAccessToken = (TeamAccessToken) AccessTokenFactory.getInstance(AccessTokenType.TEAM, cloudConfig);
        JSONObject jsonObject = teamAccessToken.decryptNotification(jsonParam);

        logger.info(JSON.toJSONString(jsonObject));


        JSONObject data = jsonObject.getJSONObject("data");
        JSONObject formInfo = data.getJSONObject("formInfo");
        JSONObject widgetMap = formInfo.getJSONObject("widgetMap");

        JSONObject s_apply = widgetMap.getJSONObject("_S_APPLY");
        JSONArray value = s_apply.getJSONArray("value");

        JSONObject ps_0 = widgetMap.getJSONObject("Ps_0");
        JSONArray ps_value = ps_0.getJSONArray("value");


//        JSONObject basicInfo = data.getJSONObject("basicInfo");
//        String formCodeId = basicInfo.getString("formCodeId");
//        String formDefId = basicInfo.getString("formDefId");
//        String formInstId = basicInfo.getString("formInstId");
//        JSONObject myPersonInfo = basicInfo.getJSONObject("myPersonInfo");
//        String oid = myPersonInfo.getString("oid");



        Map<String, Object> widgetValue2 = new HashMap<>();
        value.addAll(ps_value);

        widgetValue2.put("Ps_0", value);

        Map<String, Object> param6 = new HashMap<>();
//        param6.put("creator", oid);
//        param6.put("formCodeId", formCodeId);
//        param6.put("formDefId", formDefId);
//        param6.put("formInstId", formInstId);
        param6.put("widgetValue", widgetValue2);

//        logger.info(JSON.toJSONString(param6));
//        teamAccessToken.modifyInst(param6);

        Map<String, Object> param7 = new HashMap<>();
        param7.put("success",true);
        param7.put("error",null);
        param7.put("data", param6);
        return param7;

    }

    @RequestMapping("/push")
    @ResponseBody
    private Object test() {
        TeamAccessToken teamAccessToken = (TeamAccessToken) AccessTokenFactory.getInstance(AccessTokenType.TEAM, cloudConfig);
        Map<String, String> param = new HashMap<>();
        param.put("formInstId","5f2ba0ccef50b30001c2bcd7");
        param.put("formCodeId","9c84d3451dcc4845acd2db2554102e3e");
        JSONObject flowRecord = teamAccessToken.getFlowRecord(param);
        logger.info(JSON.toJSONString(flowRecord));
        JSONObject templateByCodeId = teamAccessToken.getTemplateByCodeId(param);
        return templateByCodeId;
    }

    @RequestMapping("/pushBI")
    @ApiOperation("查询分页")
    @ResponseBody
    private Object pushBI() throws Exception {
        TeamAccessToken teamAccessToken = (TeamAccessToken) AccessTokenFactory.getInstance(AccessTokenType.TEAM, cloudConfig);

        teamAccessToken.pushBI();


        return null;
    }

//    @RequestMapping("/getTodoList")
//    @ResponseBody
//    private Object getTodoList() {
//        TeamAccessToken teamAccessToken = (TeamAccessToken) AccessTokenFactory.getInstance(AccessTokenType.TEAM, cloudConfig);
//        Map<String, Object> paramMap = new HashMap<>();
//        Integer PAGE_SIZE=500;
//        Integer PAGE_NUMBER=1;
//
//        paramMap.put("identifyKey",cloudConfig.getIdentifyKey());
//        paramMap.put("pageNumber",PAGE_NUMBER);
//        paramMap.put("pageSize",PAGE_SIZE);
//
//        JSONObject flows = teamAccessToken.findFlows(paramMap);
//        JSONObject data = flows.getJSONObject("data");
//        JSONArray list = data.getJSONArray("list");
//        sendMsg(list, cloudflow);
//
//        boolean hasData= true;
//        while(hasData){
//            PAGE_NUMBER = PAGE_NUMBER + 1;
//            paramMap.put("pageNumber",PAGE_NUMBER);
//            flows = teamAccessToken.findFlows(paramMap);
//            data = flows.getJSONObject("data");
//            if(data.get("list")!=null) {
//                list = data.getJSONArray("list");
//                sendMsg(list, cloudflow);
//            }else {
//                hasData= false;
//            }
//        }
//
//        return "";
//    }

//    public  void sendMsg(JSONArray list, Cloudflow cloudflow) {
//        for (int i =0; i<list.size(); i++) {
//            JSONObject jsonObject = list.getJSONObject(i);
//            //申请人
//            String creator = jsonObject.getString("creator");
//
//            String createName = jsonObject.getString("createName");
//            String title = jsonObject.getString("title");
//            String templateName = jsonObject.getString("templateName");
//            //流水号
//            String serialNo = jsonObject.getString("serialNo");
//            String flow_status = jsonObject.getString("status");
//
////            if(!"CS11-20200512-003".equals(serialNo)) continue;
//
//            if (serialNo ==null || "".equals(serialNo)) continue;
//
//            String ids = null;
//            List<String> idList = new ArrayList<>();
//            String formDefId = jsonObject.getString("formDefId");
//            String formInstId = jsonObject.getString("formInstId");
//            String flowInstId = jsonObject.getString("flowInstId");
//            String formCodeId = jsonObject.getString("formCodeId");
//
//
//            String url =cloudConfig.getBaseUrl()+ formDefId+"/"+formInstId+"/"+flowInstId;
//
//            UserToDoEntity userToDo = new UserToDoEntity();
//            userToDo.setSerialNo(serialNo);
//            userToDo.setType("1");
//
//            List<UserToDoEntity> query = userToDoService.query(userToDo);
//            if(query!=null && query.size()>0) {
//                for(UserToDoEntity user: query) {
//                    idList.add(user.getOid());
//                }
//                ids =  String.join(",", idList);
//            }
//
//            String app_status = null;
//            if("RUNNING".equals(flow_status)) {
//                app_status = "审批中";
//            } else  if("SUSPEND".equals(flow_status)) {
//                app_status = "已挂起";
//            } else  if("TOSUBMIT".equals(flow_status)) {
//                app_status = "退回申请点";
//            } else  if("FINISH".equals(flow_status)) {
//                app_status = "已完成";
//            } else  if("ABANDON".equals(flow_status)) {
//                app_status = "已废弃";
//            } else {
//                app_status = "终止";
//            }
//
//            //统计所有已办数据推送
//            Map<String, String> paramMap = new HashMap<>();
//            paramMap.put("formInstId", formInstId);
//            paramMap.put("formCodeId", formCodeId);
//            JSONObject flowRecord = cloudflow.getFlowRecord(paramMap);
//            JSONArray data = flowRecord.getJSONArray("data");
//            if(flowRecord.get("data")==null) continue;
//            for (int j=0;j<data.size();j++) {
//                JSONObject jo = data.getJSONObject(j);
//                String status = jo.getString("status");
//                String name = jo.getString("name");
////                String activityName1 = jo.getString("activityName");
//                String activityType = jo.getString("activityType");
//                String taskId = jo.getString("taskId");
//                String handler = jo.getString("handler");
//                if (!"START".equals(activityType) && !"END".equals(activityType)) {
//                    //智能退回，待审批
//                    if(status!=null &&"DOING".contains(status)) {
//                        //节点有变化则待办转已办并新增待办
//                        if(ids==null) {
//                            userToDo = new UserToDoEntity();
//                            userToDo.setSerialNo(serialNo);
//                            userToDo.setOid(handler);
//                            userToDo.setName(name);
//                            userToDo.setSourceId(taskId);
//                            userToDo.setType("1");
//
//                            userToDoService.insert(userToDo);
//                            pushWait(creator,createName,title,templateName,url,userToDo);
//                        } else {
//                            if (!ids.contains(handler)) {
//                                //如果上次节点已推送待办则直接转已办
//                                userToDo = new UserToDoEntity();
//                                userToDo.setSerialNo(serialNo);
////                                userToDo.setSourceId(taskId);
//                                userToDo.setType("1");
//                                //待办变已办
//                                if(query != null && query.size()>0) {
//                                    for(UserToDoEntity user: query) {
//                                        todoDone(creator,createName,title, templateName, url, user);
//                                    }
//                                }
//
//                                //新增待办
//                                userToDo = new UserToDoEntity();
//                                userToDo.setSerialNo(serialNo);
//                                userToDo.setOid(handler);
//                                userToDo.setName(name);
//                                userToDo.setSourceId(taskId);
//                                userToDo.setType("1");
//
//                                userToDoService.insert(userToDo);
//
//                                pushWait(creator,createName,title,templateName,url,userToDo);
//                            }
//                        }
//                    }
//
//
//                    //已办接口推送
//                    if(status!=null &&"OT_DONE,DONE,SMART_RETURNED,RETURNED,ABANDON".contains(status)) {
//
//                        //如果上次节点已推送待办则直接转已办
//                        userToDo = new UserToDoEntity();
//                        userToDo.setSerialNo(serialNo);
//                        userToDo.setSourceId(taskId);
//                        userToDo.setType("1");
//
//                        query = userToDoService.query(userToDo);
//                        if(query != null && query.size()>0) {
//                            for(UserToDoEntity user: query) {
//                                todoDone(creator,createName,title, templateName, url, user);
//                            }
//                        } else {
//                            userToDo = new UserToDoEntity();
//                            userToDo.setSerialNo(serialNo);
//                            userToDo.setType("2");
//                            userToDo.setSourceId(taskId);
//                            query = userToDoService.query(userToDo);
//                            if(query==null || query.size()==0) {
//                                //先推送待办
//                                userToDo = new UserToDoEntity();
//                                userToDo.setSerialNo(serialNo);
//                                userToDo.setOid(handler);
//                                userToDo.setName(name);
//                                userToDo.setSourceId(taskId);
//                                userToDo.setType("1");
//
//                                userToDoService.insert(userToDo);
//
//                                pushWait(creator, createName, title, templateName, url, userToDo);
//                                //待办转已办
//                                todoDone(creator, createName,title,templateName,url,userToDo);
//                            }
//                        }
//                    }
//                }
//            }
//
//            userToDo = new UserToDoEntity();
//            userToDo.setSerialNo(serialNo);
//            userToDo.setOid(creator);
//            userToDo.setName(createName);
//            userToDo.setStatus(app_status);
//            userToDo.setType("0");
//
//            query = userToDoService.query(userToDo);
//            //数据为空则插入数据并推送ESB
//            if(query == null || query.size()==0) {
//                userToDoService.insert(userToDo);
//                pushApply(creator, createName, title, templateName, serialNo, url,app_status);
//            }else {
//                UserToDoEntity userToDoEntity = query.get(0);
//                if(userToDoEntity.getStatus()==null || !app_status.equals(userToDoEntity.getStatus())){
//                    userToDoEntity.setStatus(app_status);
//                    userToDoService.updateStatus(userToDoEntity);
//                    updateStatus(serialNo, app_status);
//                }
//            }
//
//        }
//    }


    public String getJSONParam(HttpServletRequest request){
        // 写入数据到Stringbuilder
        StringBuilder sb = new StringBuilder();
        try {
            // 获取输入流
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));

            String line = null;
            while ((line = streamReader.readLine()) != null) {
                sb.append(line);
            }
            // 直接将json信息打印出来
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

}
